#include "QCPort.h"
#include "analog.h"
#include "main.h"
#include "debug.h"
// DP+ PA6
// DP- PA5
// DP PA7

// DN+ PB1
// DN- PB0
// DN PB2

// float: + - is input ,no pull
//  0v: + - is output low
//  600mv: + output high,-output low
//  3300mv: + output high,-output high

static LL_GPIO_InitTypeDef GPIO_InitStruct;
void QCPortSetDP(QCSetEnum mv)
{
    switch (mv)
    {
    case QC_SET_FLOAT:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_5;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        break;
    case QC_SET_0V:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_5;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_6 | LL_GPIO_PIN_5);
        break;
    case QC_SET_600mv:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_5;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_6);
        LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_5);
        break;
    case QC_SET_3300mv:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_5;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_6 | LL_GPIO_PIN_5);
        break;
    default:
        break;
    }
}
void QCPortSetDN(QCSetEnum mv)
{
    switch (mv)
    {
    case QC_SET_FLOAT:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_1 | LL_GPIO_PIN_0;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        break;
    case QC_SET_0V:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_1 | LL_GPIO_PIN_0;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_1 | LL_GPIO_PIN_0);
        break;
    case QC_SET_600mv:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_1 | LL_GPIO_PIN_0;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_1);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_0);
        break;
    case QC_SET_3300mv:
        GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
        GPIO_InitStruct.Pin = LL_GPIO_PIN_1 | LL_GPIO_PIN_0;
        GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
        GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
        LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_1 | LL_GPIO_PIN_0);
        break;
    default:
        break;
    }
}

// volt/3.3V = adc/4096
// volt = adc*3.3*1000/8192
unsigned int QCPortDPGetVolt(void)
{
    unsigned long volt;
    volt = analogGetValue(ANALOG_DP, 1);
    volt = volt * 3300 / 4096;
    //PRINTF("QC DP volt:%ld\n", volt);
    return (unsigned int)volt;
}
unsigned int QCPortDNGetVolt(void)
{
    unsigned long volt;
    volt = analogGetValue(ANALOG_DN, 1);
    volt = volt * 3300 / 4096;
    //PRINTF("QC DN volt:%ld\n", volt);
    return (unsigned int)volt;
}
